#include <DynamicArray.h>
#include <stdbool.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
#include "Scene.h"
#include "player.h"
#include "monster.h"
#include "prop.h"



#define DAMAGE(a,b) ((a->attack)-(b->def))


bool StartGame(player*p,DArray* ms)
{
    while(1)
    {
        system("clear");
        printf("——————————Dungeon——————————\n");
        printf("1.开始新游戏\n");
        printf("2.载入存档\n");
        printf("3.退出游戏\n");
        int choice = 0;
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
            system("clear");
            return true;
            break;

            case 2:
           if(LoadGame(p,ms)==true)
           {
            return false;
           }
            break;
            case 3:
            printf("确定退出游戏吗?\n");
            printf("1 是 or 2 否\n");
            int confirm = 0;
            scanf("%d",&confirm);
            if(confirm == 1)
            {
                exit(0);
            }
            else if(confirm == 2)
            {
                break;
            }
            

            default:
            break;
        }
    }
    return true;
}

bool battle(player* p,monster* m)
{
    system("clear");
    printf("遭遇了%s!\n准备战斗!\n",m->name.string);
    printf("%s 🆚 %s\n",p->symbol,m->symbol.string);
    sleep(1);
    /*让程序休眠*/
    int temp=m->HP;
    while(1)
    {
        system("clear");
        printf("怪物信息:%s 名称:%s 生命值💝: %d/%d \n",m->symbol.string,m->name.string,m->HP,temp);
        PrintPlayerStatus(p);
        printf("\n———————————— 如何行动？ ——————————\n");
        printf("1 攻击🤜(命中率: 75%% )\n\n");
        printf("2 蓄力攻击💪(消耗气力)\n\n");
        printf("3 逃跑 👟\n\n");
        printf("4 使用道具✋\n");
        int choice = 0;
        while(getchar()!='\n');
        
        scanf("%d",&choice);
        switch (choice)
        {
            case 1:
                if(GetRand(4)!=0)
                {

                    printf("你对【%s】发起了进攻🤜, 造成了 %d 点伤害\n",m->name.string,DAMAGE(p,m)>0?DAMAGE(p,m):0);
                    sleep(1);
                    if(p->MP<3)
                    {
                        p->MP++;
                    }
                    m->HP-=DAMAGE(p,m)>0?DAMAGE(p,m):0;
                    /*武器效果*/

                    int WpnEffect = WeaponEffect(p,m);
                    if(WpnEffect==Frozen)
                    {
                        break;
                    }
                       
                    if(m->HP>0)
                    {
                        printf("【%s】对你发起了反击, 造成了 %d 点伤害\n",m->name.string,DAMAGE(m,p)>0?DAMAGE(m,p):0);
                        sleep(1);
                        ArmorEffect(p,m);
                        p->HP-=DAMAGE(m,p)>0?DAMAGE(m,p):0;
                    }
                }
                else
                {
                    printf("你鲁莽地😋对【%s】发起了进攻, 没有完全打中,造成了 %d 点伤害\n",m->name.string,(DAMAGE(p,m)>0?DAMAGE(p,m):0)/2);
                    sleep(1);
                    m->HP-=(DAMAGE(p,m)>0?DAMAGE(p,m):0)/2;
                    if(m->HP>0)
                    {

                        printf("【%s】对你发起了反击, 造成了 %d 点伤害\n",m->name.string,DAMAGE(m,p)>0?DAMAGE(m,p):0);
                        sleep(1);
                        p->HP-=DAMAGE(m,p)>0?DAMAGE(m,p):0;
                        ArmorEffect(p,m);
                        
                    }
                }
               
                break;
            case 2:
                MPAttack(p,m);
                break;
            case 3:
                if(IsEqual(&m->name,"英雄古达")==true)
                {
                    printf("由于【震慑】😵的效果,逃跑失败！\n");
                    printf("【%s】对试图逃跑的你使用了【极霸矛】, 造成了 %d 点伤害\n",m->name.string,(DAMAGE(m,p)>0?DAMAGE(m,p):0)*2);
                    sleep(1);
                    p->HP-=2*(DAMAGE(m,p)>0?DAMAGE(m,p):0);
                    ArmorEffect(p,m);
                    
                    break;
                }
                    if((GetRand(3))==1)
                    {
                        printf("逃跑成功!🏃\n");
                        sleep(2);
                        
                        return true;
                    }
                    else
                    {
                        printf("逃跑失败!🐌\n");
                        printf("【%s】对你发起了【追击】, 造成了 %d 点伤害\n",m->name.string,(DAMAGE(m,p)>0?DAMAGE(m,p):0)/2);
                        sleep(1);
                        p->HP-=(DAMAGE(m,p)>0?DAMAGE(m,p):0)/2;
                        ArmorEffect(p,m);
                        
                        break;
                    }
            case 4:  
                ItemUse(p);  //道具使用界面
                if(m->HP>0)
                    {
                        printf("【%s】趁机对你发起了攻击, 造成了 %d 点伤害\n",m->name.string,DAMAGE(m,p)>0?DAMAGE(m,p):0);
                        sleep(1);
                        p->HP-=(DAMAGE(m,p)>0?DAMAGE(m,p):0);
                        ArmorEffect(p,m);
                    }
                break;
            default :
                break;

           
        }
        sleep(1);
        if(p->HP<=0)
        {
            p->HP=0;
            printf("你被【%s】杀死了!\n",m->name.string);
            sleep(1);
            return false;
        }
        if(m->HP<=0)
        {
            m->HP=0;
            printf("击杀了【%s】!\n",m->name.string);
            p->exp+=m->exp;
            printf("战斗胜利!\n");
            printf("获得了 %d 点经验值!\n",m->exp);
            if(GetRand(4)!=0)
            {
                p->gold+=m->gold;
                printf("取得了 %d 个金币!\n",m->gold);
            }
            sleep(2);
            
            return true;
        }
    }
}


/*魔塔*/
int main(int argc, char* argv[])
{
    Login();

    /*地图和人物初始化*/
    char* Map[MAPSIZE][MAPSIZE] = {0};
    InitMap(Map);
    player p;
    InitPlayer(&p);

    INITSTR(save);

    /*初始化怪物*/
    INITDARRAY(monsters);

    SetMonsters(&monsters);   //把怪物放入数组
    
   if( StartGame(&p,&monsters) == true)      //判断进入方式是新游戏还是读档
    {
        SetMonstersPosition(&monsters,Map);
        Map[p.x][p.y] = p.symbol;
    }
    else
    {
        ResetMonsterSPosition(&monsters,Map);
        Map[p.x][p.y] = p.symbol;
    }
    PrintMap(Map);
    
    monster* backmonster = NULL;
    while(1)
    {
        PrintPlayerStatus(&p);    //打印玩家状态

        PlayerMove(Map,&p,&monsters);    //玩家的主要操作
        
        LevelUp(&p);                //判断操作完是否升级(使用经验道具)

        if(p.HP<=0||p.HPMax<=0)
        {
            printf("你已死亡,游戏结束!\n");      //判断是否死亡(道具惩罚)
            return -1;
        }

        /*逃跑后把怪物图标返还*/
        if(backmonster!=NULL)
        {
            Map[backmonster->x][backmonster->y] = backmonster->symbol.string;
            backmonster = NULL;
        }

        monster* m = GetMonsterByPosition(&monsters,p.x,p.y);
        if(m!=NULL)
        {
            if(battle(&p,m) == false)
            {
                printf("游戏结束!\n");
                return -1;
            }
            
            if(m->HP==0)
            {
                if(IsEqual(&m->name,"英雄古达")==true)
                {
                    printf("你已击败本层boss【英雄古达🕺】!\n");
                    sleep(1);
                    printf("游戏胜利!\n");
                    return 0;
                }
                LevelUp(&p);
                Map[m->x][m->y]=p.symbol;
            }
            else
            {
                backmonster = m;
            }
        }
        PrintMap(Map);
    }
    return 0;
}